
package com.be.beadmin.project.service;


import com.be.beadmin.basicData.dto.input.UserDto;
import com.be.beadmin.basicData.entity.User;
import com.be.beadmin.common.entity.PageEntity;
import com.be.beadmin.project.dto.input.InfoAndPayDto;
import com.be.beadmin.project.dto.input.InfoDto;
import com.be.beadmin.project.dto.input.ProjectNameAndCode;
import com.be.beadmin.project.dto.output.InfoAndPayEx;
import com.be.beadmin.project.dto.output.InfoCodeEx;
import com.be.beadmin.project.dto.output.InfoEx;
import com.be.beadmin.project.dto.output.UserInfoSimpEx;
import com.be.beadmin.project.entity.Info;
import io.minio.errors.*;
import org.apache.commons.math3.stat.descriptive.summary.Product;
import org.springframework.data.domain.Page;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* @description 服务接口
* @author zmy
* @date 2023-01-13
**/
public interface InfoService {

    /**
    * 分页的查询接口
    * @param pageEntity
    * @return
    */
    Page<InfoEx> getInfoByPage(PageEntity pageEntity);


    Page<Info> getInfoByPageOrigin(PageEntity pageEntity);

    /**
    * @param infoDto
    */
    int addInfo(InfoDto infoDto);

    /**
    * @param infoDto
    */
    void updateInfo(InfoDto infoDto);



//    /**
//    * @param id
//    */
//    void delInfo(HttpServletRequest request,String id);

    /**
    * 删除多个角色
    * @param ids
    */
    void delInfos (List<String> ids);

//    void genenateProductAll(List<ProductInfo> productInfos);

//    void genenateProduct(ProductTotalInfo productTotalInfo);

    InfoCodeEx getContractAndInfoCodeNext();

    /**
     * 暂停执行项目
     * @param infoId
     * @return
     */
    Info pauseOrStartProject(String infoId);

    /**
     * 获取所有项目的项目名称和编码
     * @return
     */
    List<ProjectNameAndCode> getProjectNameAndCodeSimp();

    /**
     * 新增项目信息包含付款信息
     * @param infoAndPayDto
     * @return
     */
    int addInfoAndPay(InfoAndPayDto infoAndPayDto);

    Page<InfoAndPayEx> getInfoAndPayByPage(PageEntity pageEntity);

    /**
     * 项目审核
     * @param infoId
     * @param reviewMemo
     * @param multipartFile
     */
    void infoReview(String infoId, String reviewMemo, MultipartFile multipartFile) throws InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;

    /**
     * 获取指定用户的所有项目信息
     * @param user
     * @return
     */
    List<InfoEx> getInfoByUser(User user);

    /**
     * 获取当前用户的所有项目信息
     * @param request
     * @return
     */
    List<InfoEx> getInfoByCurrentUser(HttpServletRequest request);


    /**
     * 获取当前用户的所有项目Id
     * @param request
     * @return
     */
    List<String> getInfoIdByCurrentUser(HttpServletRequest request);

    /**
     * 获取id的项目信息
     * @param id
     * @return
     */
    Info getInfoIdById(String id);

    /**
     * 根据项目ID获取该项目的所有用户
     * @param infoId
     * @return
     */
    List<UserInfoSimpEx> getUsersByInfoId(String infoId);
    /**
     * 获取项目进度信息
     * @return
     */
    ArrayList<Integer> getInfoProgress();

    /**
     * 根据项目编码获取项目信息
     * @param projectCode
     * @return
     */
    Info getInfoByProjectCode(String projectCode);

    Info shutOrStartProject(String infoId);

    /**
     * 获取项目名称列表
     * @return
     */
    List<String> getProjectNameList();

    /**
     * 根据项目名称获取项目编号
     * @return
     */
    String getProjectCodeByProjectName(String projectName);

//    Page<String> getInfoNameByPage(PageEntity pageEntity);

    /**
     * 根据项目编码查询项目是否存在
     */
    boolean existsProjectCode(String projectCode);

    /**
     * 根据项目经理查询是否存在该用户
     */
    boolean existsProjectManger(String projectManger);

    /**
     * 根据项目经理查询是否拥有对应的权限
     */
    boolean existsUserRole(String projectManger);

    /**
     * 插入项目的所有信息
     */
    void insertProjectInfo(Info info);

    /**
     * 根据项目编码查询所有的信息
     * @param projectCode
     * @return
     */
    Info getProjectInfos(String projectCode);

}